package main

import "fmt"

/*
*
给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i，nums[i] = [starti, endi] ，其中 starti 是第 i 辆车的起点，endi 是第 i 辆车的终点。

返回数轴上被车 任意部分 覆盖的整数点的数目。

示例 1：

输入：nums = [[3,6],[1,5],[4,7]]
输出：7
解释：从 1 到 7 的所有点都至少与一辆车相交，因此答案为 7 。
示例 2：

输入：nums = [[1,3],[5,8]]
输出：7
解释：1、2、3、5、6、7、8 共计 7 个点满足至少与一辆车相交，因此答案为 7 。

提示：

1 <= nums.length <= 100
nums[i].length == 2
1 <= starti <= endi <= 100
*/
func main() {
	//nums := [][]int{{3, 6}, {1, 5}, {4, 7}}
	nums := [][]int{{1, 3}, {5, 8}}

	fmt.Println(numberOfPoints(nums))
}
func numberOfPoints(nums [][]int) int {
	//return V1(nums)
	return top1(nums)
}

/**
 *	榜一的做法（遍历每个区间的每一位，只有第一次未打标时才会累加数量，而且遍历后立刻打标）
 */
func top1(nums [][]int) int {
	cnt := 0
	var vis [102]int
	for _, ns := range nums {
		s, e := ns[0], ns[1]
		for i := s; i <= e; i++ {
			if vis[i] == 0 {
				cnt += 1
			}
			vis[i] = 1
		}
	}
	return cnt
}

/**
 *	差分
 */
func V1(nums [][]int) int {
	var diff [102]int
	mx := -1
	for _, ns := range nums {
		s, e := ns[0], ns[1]
		diff[s] += 1
		diff[e+1] -= 1
		mx = max(mx, e+1)
	}

	cnt, sum := 0, 0
	for _, d := range diff {
		sum += d
		if sum > 0 {
			cnt += 1
		}
	}
	return cnt
}
